package com.llongwill.slg.gateway.user.service;

import cn.dev33.satoken.stp.StpUtil;
import com.llongwill.slg.gateway.user.support.UserLoginResult;
import com.llongwill.slg.user.appservice.IThreeHelperUserQueryAppService;
import com.llongwill.slg.user.entity.UserDTO;
import com.llongwill.slg.user.entity.UserTokenResultDTO;
import com.xiangff.base.business.BaseBusinessService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Objects;

import static com.llongwill.slg.gateway.common.GatewayConstants.KEYS_SCHOOL_ID;
import static com.xiangff.base.framework.constants.SecurityConstants.USER_HEADER;
import static com.xiangff.base.framework.resp.DefaultResponseCodeEnum.LOGIN_FAIL;
import static java.util.Objects.isNull;

/**
 * 三个助手登录服务
 *
 * @author xiangff
 * @date 2024-06-04 16:23
 */
@Service
@Slf4j
public class ThreeHelperLoginService extends BaseBusinessService {

    @Autowired
    private IThreeHelperUserQueryAppService threeHelperUserQueryAppService;


    /**
     * 根据ID令牌登录用户。
     *
     * @param idToken 用户的ID令牌，用于识别用户身份。
     * @return 用户登录结果，包括登录是否成功、用户信息等。
     */
    public UserLoginResult loginByIdToken(String idToken, String xBusinessHeader, String eduStage, String eduSubject) {

        // 通过ID令牌查询用户信息。
        UserTokenResultDTO userTokenResult = threeHelperUserQueryAppService.getUserByIdToken(idToken, xBusinessHeader, eduStage, eduSubject);
        // 检查用户信息是否为空或ID为空，如果为空，则登录失败。
        if (isNull(userTokenResult)) {
            // 构建登录失败的结果。
            return UserLoginResult.builder()
                    .loginSuccess(false)
                    .loginCode(LOGIN_FAIL.getCode())
                    .loginMessage(LOGIN_FAIL.getMessage())
                    .build();
        }
        if (!Boolean.TRUE.equals(userTokenResult.getSuccess()) || Objects.isNull(userTokenResult.getResult())) {
            return UserLoginResult.builder()
                    .loginSuccess(false)
                    .loginCode(userTokenResult.getResultCode())
                    .loginMessage(userTokenResult.getResultMessage())
                    .build();
        }

        //登录用户
        UserDTO userDTO = userTokenResult.getResult();

        // 登录
        StpUtil.login(userDTO.getId());
        // 如果用户有学校ID，设置学校ID到会话中。
        if (StringUtils.isNotBlank(userDTO.getSchoolId())) {
            StpUtil.getSession().set(KEYS_SCHOOL_ID, userDTO.getSchoolId());
        }
        StpUtil.getSession().set(USER_HEADER, userDTO.getUserName());
        // 构建登录成功的用户结果，包括用户ID、学校ID、用户名等信息。
        // 登录成功
        return UserLoginResult.builder()
                .loginSuccess(true)
                .userId(userDTO.getId())
                .schoolId(userDTO.getSchoolId())
                .userName(userDTO.getUserName())
                .loginName(userDTO.getLoginName())
                .token(StpUtil.getTokenInfo().getTokenValue())
                .idToken(userDTO.getIdToken())
                .accessToken(userDTO.getAccessToken())
                .userRoles(userDTO.getRoles())
                .build();
    }
}
